/* 
 * ViaturaInsertUpdateRule.java
 * 
 * Data de criação: 15/09/2010
 * 
 * CORPORATIVO - MTE. 
 *
 */
package br.com.o2solutions.siso.business.rule.viatura;

import java.util.Calendar;
import java.util.List;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import br.com.o2solutions.core.exception.BusinessException;
import br.com.o2solutions.core.integration.repository.DataBaseIntegration;
import br.com.o2solutions.core.service.rule.Rule;
import br.com.o2solutions.siso.integration.entidade.Viatura;
import br.com.o2solutions.util.assertion.Assert;

/**
 * Classe responsável por realizar a validação no ato de persistência ou
 * atualização de uma viatura quanto a duplicidade de placas e prefixo+ano.
 * 
 * @author Osvaldeir
 * @since 15/09/2010
 * 
 */
@Component("viaturaInsertUpdateRule")
public class ViaturaInsertUpdateRule implements Rule<Viatura> {

	@Value("#{viaturaDAO}")
	private DataBaseIntegration<Viatura> viaturaDAO;

	/**
	 * {@inheritDoc}
	 * <p>
	 * O cadastro de viaturas com a mesma placa ou com o mesmo prefixo e ano é
	 * considerado uma quebra negocial, assim, é lançada uma
	 * {@link BusinessException} com a chave <b>error.viatura.existis</b>
	 * informando a existência da Viatura na base de dados.
	 * </p>
	 */
	@Override
	public void check(Viatura entity) throws BusinessException {
		List<Viatura> resultList = viaturaDAO.findByNamedQuery(
				"Viatura.findByPrefixoFabricacaoOrPlaca", entity.getPrefixo(),
				entity.getFabricacao(), entity.getPlaca());
		resultList.remove(entity);
		Assert.isEmpty(resultList, new BusinessException(
				"Viatura ja cadastrada com os dados informados",
				"error.viatura.existis", entity.getPrefixo(), entity
						.getFabricacao()));

		validaAnoFabricacaoAnoModelo(entity);
		
	}
	/**
	 * Método que valida se o ano de fabricação é <= ao ano do modelo e ano corrente.
	 * @param entity
	 */
	public void validaAnoFabricacaoAnoModelo(Viatura entity) {
		Calendar cal = Calendar.getInstance();
		int anoCorrente = cal.get(Calendar.YEAR);
		Assert
				.isTrue(
						((entity.getFabricacao() <= entity.getModelo()) && (entity.getFabricacao() <= anoCorrente)),
						new BusinessException(
								"O ano de fabricação deve ser menor que ano do modelo e o ano corrente.",
								"error.viatura.ano.fabricacao", entity
								.getFabricacao(), entity.getModelo()));
	}


	
}
